package com.ruoyi.system.domain;

import com.ruoyi.common.domain.BaseEntity;
import org.babyfish.jimmer.Formula;
import org.babyfish.jimmer.sql.*;
import org.springframework.lang.Nullable;

import java.util.List;

import static com.ruoyi.common.core.constant.ServiceNameConstants.SYSTEM_SERVICE;

/**
 * 角色表 sys_role
 *
 * @author ruoyi
 */
@Entity(microServiceName = SYSTEM_SERVICE)
@Table(name = "sys_role")
public interface SysRole extends BaseEntity {

    /**
     * 角色ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    long roleId();

    /**
     * 角色名称
     */
    String roleName();

    /**
     * 角色权限
     */
    String roleKey();

    /**
     * 角色排序
     */
    Integer roleSort();

    /**
     * 数据范围（1：所有数据权限；2：自定义数据权限；3：本部门数据权限；4：本部门及以下数据权限；5：仅本人数据权限）
     */
    String dataScope();

    /**
     * 菜单树选择项是否关联显示（ 0：父子不互相关联显示 1：父子互相关联显示）
     */
    boolean menuCheckStrictly();

    /**
     * 部门树选择项是否关联显示（0：父子不互相关联显示 1：父子互相关联显示 ）
     */
    boolean deptCheckStrictly();

    /**
     * 角色状态（0正常 1停用）
     */
    String status();

    /**
     * 删除标志（0代表存在 2代表删除）
     */
    @Default("0")
    @LogicalDeleted("2")
    int delFlag();


    /**
     * 菜单组
     */
    @IdView("menus")
    List<Long> menuIds();

    @ManyToMany
    @JoinTable(
            name = "sys_role_menu",
            joinColumnName = "role_id",
            inverseJoinColumnName = "menu_id"
    )
    List<SysMenu> menus();

    /**
     * 部门组（数据权限）
     */
    @IdView("depts")
    List<Long> deptIds();

    @ManyToMany
    @JoinTable(
            name = "sys_role_dept",
            joinColumnName = "role_id",
            inverseJoinColumnName = "dept_id"
    )
    List<SysDept> depts();

    @ManyToMany(mappedBy = "roles")
    List<SysUser> users();

    @IdView("users")
    List<Long> userIds();

    /**
     * 创建者
     */
    @Nullable
    @ManyToOne
    @OnDissociate(DissociateAction.SET_NULL)
    @JoinColumn(name = "create_by")
    SysUser createBy();

    /**
     * 更新者
     */
    @Nullable
    @ManyToOne
    @OnDissociate(DissociateAction.SET_NULL)
    @JoinColumn(name = "update_by")
    SysUser updateBy();

    @Formula(dependencies = {"roleId"})
    default boolean isAdmin() {
        return roleId() == 1L;
    }
}
